package migrate

import (
	"192.168.1.75/go-pkg/helper"
	"sale-admin/config/mysql"
	"sale-admin/internal/models"

	"gorm.io/gorm"
)

func (MigrateFunc) Script202311() error {
	// 修正订单实付金额，区分订单金额和实付金额
	mysql.NewDB().Exec("update ma_order set actual_amount = payment_amount where actual_amount = 0.00 and payment_amount != 0.00")
	return nil
}

func (MigrateFunc) Script202312() error {
	tx := mysql.NewDB().Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci").
		Session(&gorm.Session{})

	tx.Migrator().AutoMigrate(&models.MaCouponBatch{})
	tx.Migrator().AutoMigrate(&models.MaCouponCode{})
	tx.Migrator().AutoMigrate(&models.MaCouponLog{})
	// 2023.12.18日新增
	tx.Migrator().AutoMigrate(&models.MaCouponGoods{})     // 使用优惠码商品表存储选择的商品
	tx.Migrator().AutoMigrate(&models.MaCouponChildCode{}) // 并发和锁
	tx.Migrator().AutoMigrate(&models.MaGoodsInfo{})       // 新增推荐字段
	tx.Migrator().AutoMigrate(&models.MaGoodsBackground{}) // 新增推荐字段

	// 增加日期字段
	if !tx.Migrator().HasColumn(&models.MaAIServiceFaceCount{}, "created_date") {
		tx.Migrator().AddColumn(&models.MaAIServiceFaceCount{}, "created_date")
	}
	if !tx.Migrator().HasColumn(&models.MaGoodsClick{}, "created_date") {
		tx.Migrator().AddColumn(&models.MaGoodsClick{}, "created_date")
	}
	if !tx.Migrator().HasColumn(&models.MaOrder{}, "created_date") {
		tx.Migrator().AddColumn(&models.MaOrder{}, "created_date")
	}
	if !tx.Migrator().HasColumn(&models.MaPhysicalInfo{}, "created_date") {
		tx.Migrator().AddColumn(&models.MaPhysicalInfo{}, "created_date")
	}

	// 机器表 商户变更时间及商户路径
	if !tx.Migrator().HasColumn(&models.MaRobot{}, "merchant_path") {
		tx.Migrator().AddColumn(&models.MaRobot{}, "merchant_path")
	}
	if !tx.Migrator().HasColumn(&models.MaRobot{}, "merchant_changed_at") {
		tx.Migrator().AddColumn(&models.MaRobot{}, "merchant_changed_at")
	}
	tx.AutoMigrate(&models.RobotDailyReport{})
	if tx.Migrator().HasIndex(&models.RobotDailyReport{}, "Date_RobotName") {
		tx.Migrator().DropIndex(&models.RobotDailyReport{}, "Date_RobotName")
	}

	// 新增优惠码号字段
	if !tx.Migrator().HasColumn(&models.MaOrder{}, "coupon_code") {
		tx.Migrator().AddColumn(&models.MaOrder{}, "coupon_code")
	}

	tx.Migrator().AutoMigrate(&models.MaGoodsCornerLabel{})
	return nil
}

func (MigrateFunc) Script202401() error {
	tx := mysql.NewDB().Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci").
		Session(&gorm.Session{})

	if !tx.Migrator().HasIndex(&models.RobotDailyReport{}, "idx_createdDate_merchantID_robotName") {
		tx.Migrator().CreateIndex(&models.RobotDailyReport{}, "idx_createdDate_merchantID_robotName")
	}

	// tx.Migrator().AutoMigrate(&models.MaPaymentPos{}) // 新增POS支付方式的配置
	tx.Migrator().AddColumn(&models.MaWechatUser{}, "mallcoo_ticket")
	tx.Migrator().AlterColumn(&models.MaWechatUser{}, "user_id")

	return nil
}

// 订单商品数据迁移
// go run main.go fixdb -t order_save_goods 2024-01-01 2024-03-31
func (MigrateFunc) Script202403() error {
	tx := mysql.NewDB().Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci").
		Session(&gorm.Session{})

	tx.AutoMigrate(&models.MaOrderGoods{})
	if tx.Migrator().HasIndex(&models.MaOrderGoods{}, "GoodsID") {
		tx.Migrator().DropIndex(&models.MaOrderGoods{}, "GoodsID")
	}
	if !tx.Migrator().HasIndex(&models.MaOrderGoods{}, "idx_GoodsName") {
		tx.Migrator().CreateIndex(&models.MaOrderGoods{}, "idx_GoodsName")
	}

	tx.Migrator().AlterColumn(&models.RobotDailyReport{}, "facecount")
	tx.Migrator().AlterColumn(&models.RobotDailyReport{}, "facecount_front")
	tx.Migrator().AlterColumn(&models.RobotDailyReport{}, "facecount_left")
	tx.Migrator().AlterColumn(&models.RobotDailyReport{}, "facecount_right")
	tx.Migrator().AutoMigrate(&models.MaGoodsInfo{})           // 新增商品广告推荐图
	tx.Migrator().AutoMigrate(&models.MaGoodsActivityDetail{}) // 新增活动类型字段。

	return nil
}

// 1.交易金额
// go run main.go fixdb -t robot_daily_report_transaction_amount 2024-01-01 2024-03-31
// 2.商品日报表数据
// go run main.go fixdb -t goods_daily_report_data 2024-01-01 2024-03-31
func (MigrateFunc) Script202404() error {
	tx := mysql.NewDB().Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci").
		Session(&gorm.Session{})
	tx.Migrator().AlterColumn(&models.MaOrderGoods{}, "goods_name")
	tx.Migrator().AddColumn(&models.RobotDailyReport{}, "transaction_amount")
	// 商品日报表
	tx.Migrator().AutoMigrate(&models.GoodsDailyReport{})
	tx.Migrator().AutoMigrate(&models.MaLotteryActivity{})  // 新增抽奖活动
	tx.Migrator().AutoMigrate(&models.MaLotteryPrizeRule{}) // 更新奖品规则
	tx.Migrator().AutoMigrate(&models.MaObjAssociation{})   // 更新对象关联表
	tx.Migrator().AutoMigrate(&models.MaLotteryOrder{})

	// 新增：订单抽奖活动ID字段
	if !tx.Migrator().HasColumn(&models.MaOrder{}, "lottery_activity_id") {
		tx.Migrator().AddColumn(&models.MaOrder{}, "lottery_activity_id")
	}
	// 新增:订单是否抽奖字段
	if !tx.Migrator().HasColumn(&models.MaOrder{}, "is_visit_lottery") {
		tx.Migrator().AddColumn(&models.MaOrder{}, "is_visit_lottery")
	}
	if tx.Migrator().HasIndex(&models.GoodsDailyReport{}, "idx_createdDate_goodsID_robotName") {
		tx.Migrator().DropIndex(&models.GoodsDailyReport{}, "idx_createdDate_goodsID_robotName")
	}
	tx.Migrator().CreateIndex(&models.GoodsDailyReport{}, "idx_createdDate_robotName_goodsID")

	if tx.Migrator().HasIndex(&models.GoodsDailyReport{}, "idx_goodsName") {
		tx.Migrator().DropIndex(&models.GoodsDailyReport{}, "idx_goodsName")
	}

	tx.Migrator().CreateIndex(&models.GoodsDailyReport{}, "idx_createdDate_goodsName")

	tx.Migrator().DropIndex(&models.GoodsDailyReport{}, "idx_merchantID")
	tx.Migrator().CreateIndex(&models.GoodsDailyReport{}, "idx_createdDate_merchantID")
	tx.Migrator().DropIndex(&models.RobotDailyReport{}, "idx_robotName_createdDate")
	tx.Migrator().CreateIndex(&models.RobotDailyReport{}, "idx_createdDate_robotName")

	tx.Migrator().AlterColumn(&models.MaGoodsInfo{}, "merchant_id")
	return nil
}

// 处理空货表合并
// go run main.go fixdb -t robot_empty_stock 2024-01-01 2024-03-31
// go run main.go fixdb -t robot_empty_stock_log 2024-01-01 2024-03-31
func (MigrateFunc) Script202405() error {
	tx := mysql.NewDB().Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci").
		Session(&gorm.Session{})
	tx.Migrator().AutoMigrate(&models.MaRobotEmptyStock{})
	// 迁移旧的关联数据
	// 关联类型，关联id，去除更新时间，去除删除时间,增加索引
	tx.Migrator().AutoMigrate(&models.MaObjAssociation{})
	tx.Migrator().DropColumn(&models.MaObjAssociation{}, "updated_at")
	tx.Migrator().DropColumn(&models.MaObjAssociation{}, "deleted_at")
	tx.Migrator().CreateIndex(&models.MaObjAssociation{}, "idx_association")
	mysql.NewDB().Exec("ALTER TABLE ma_obj_association MODIFY association_type int AFTER id")
	mysql.NewDB().Exec("ALTER TABLE ma_obj_association MODIFY association_id VARCHAR(30) AFTER obj_id")
	// 允许没有条件的全局更新
	{
		err1 := mysql.NewDB().Session(&gorm.Session{AllowGlobalUpdate: true}).Model(&models.MaObjAssociation{}).Update("association_type", gorm.Expr("obj_type")).Error
		err2 := mysql.NewDB().Session(&gorm.Session{AllowGlobalUpdate: true}).Model(&models.MaObjAssociation{}).Update("association_id", gorm.Expr("association")).Error
		if err1 == nil && err2 == nil {
			tx.Migrator().DropColumn(&models.MaObjAssociation{}, "obj_type")
			tx.Migrator().DropColumn(&models.MaObjAssociation{}, "association")
		}
	}
	tx.Migrator().AutoMigrate(&models.DataCompareTemplate{})
	return nil
}

// go run main.go fixdb -t face_count_migrate
// go run main.go fixdb -t backfill_order_goods_id
// go run main.go fixdb -t fix_order_add_time
// Script202406
// 需要执行订单数据处理，回填goods_id字段的值
func (MigrateFunc) Script202406() error {
	tx := mysql.NewDB().Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci").
		Session(&gorm.Session{})
	// 删除旧的广告表
	tx.Migrator().DropTable("ma_ad", "ma_ad_source", "ma_ad_source_detail")
	// 删除旧的优惠码表
	tx.Migrator().DropTable("ma_coupon_batch")
	tx.Migrator().DropTable("ma_coupon_code")
	tx.Migrator().DropTable("ma_coupon_child_code")
	tx.Migrator().DropTable("ma_coupon_goods")
	tx.Migrator().DropTable("ma_coupon_log")
	tx.Migrator().AutoMigrate(&models.CouponBatch{}, &models.CouponCode{}, &models.CouponChildCode{}, &models.CouponLog{})
	// 更新导流活动表
	tx.Migrator().AutoMigrate(&models.MaActivity{})
	// 新增活动订单表
	tx.Migrator().AutoMigrate(&models.ActivityOrder{})
	tx.Migrator().AutoMigrate(&models.MaRobotEmptyStock{})

	if !tx.Migrator().HasIndex(&models.MaSaleInfoLogDetail{}, "idx_salesid_goodsid") {
		tx.Migrator().CreateIndex(&models.MaSaleInfoLogDetail{}, "idx_salesid_goodsid")
	}
	// 凝视
	tx.Migrator().AutoMigrate(&models.StareCount{}, &models.StareAgeGender{})

	// 机器日报表增加凝视字段
	if !tx.Migrator().HasColumn(&models.RobotDailyReport{}, "starecount") {
		tx.Migrator().AddColumn(&models.RobotDailyReport{}, "starecount")
	}
	if !tx.Migrator().HasColumn(&models.RobotDailyReport{}, "starecount_front") {
		tx.Migrator().AddColumn(&models.RobotDailyReport{}, "starecount_front")
	}
	if !tx.Migrator().HasColumn(&models.RobotDailyReport{}, "starecount_left") {
		tx.Migrator().AddColumn(&models.RobotDailyReport{}, "starecount_left")
	}
	if !tx.Migrator().HasColumn(&models.RobotDailyReport{}, "starecount_right") {
		tx.Migrator().AddColumn(&models.RobotDailyReport{}, "starecount_right")
	}

	// 更新订单表schema
	// 移除不需要的列
	tx.Exec("ALTER TABLE ma_order Drop COLUMN id")                 // 原商户id，现在使用merchant_id字段
	tx.Exec("ALTER TABLE ma_order Drop COLUMN class_id_list")      // 无用的
	tx.Exec("ALTER TABLE ma_order Drop COLUMN good_id_list")       // 无用的
	tx.Exec("ALTER TABLE ma_order Drop COLUMN container_num_list") // 无用的
	// 添加列
	tx.Migrator().AddColumn(&models.MaOrder{}, "goods_id")      // 增加商品id，从count_data中回填数据
	tx.Migrator().AddColumn(&models.MaOrder{}, "goods_price")   // 增加商品价格，从count_data中回填数据
	tx.Migrator().AddColumn(&models.MaOrder{}, "container_num") // 增加商品货道，从count_data中回填数据
	// 移除不需要的索引
	tx.Exec("ALTER TABLE ma_order DROP INDEX OrderID")                                           // 重复的，主键本身就是索引
	tx.Exec("ALTER TABLE ma_order DROP INDEX SalesID")                                           // 命令不标准，使用idx_salesID替换
	tx.Exec("ALTER TABLE ma_order DROP INDEX AddTime")                                           // 重复的索引
	tx.Exec("ALTER TABLE ma_order DROP INDEX PaymentID")                                         // 用idx_addTime_paymentID替换
	tx.Exec("ALTER TABLE ma_order DROP INDEX OrderStatus")                                       // 用idx_addTime_orderStatus替换
	tx.Exec("ALTER TABLE ma_order DROP INDEX idx_aomdp")                                         // 根据使用频次，分解为idx_addTime_orderStatus，idx_addTime_merchantID
	tx.Exec("ALTER TABLE ma_order DROP INDEX OutTradeNoIndex")                                   // 用idx_addTime_outTradeNo替换
	tx.Exec("ALTER TABLE ma_order DROP INDEX idx_discount_amount")                               // 不需要
	tx.Exec("ALTER TABLE ma_order DROP INDEX idx_child_out_trade_no")                            // 用idx_childOutTradeNo替换
	tx.Exec("ALTER TABLE ma_order DROP INDEX ReFunTradeNo")                                      // 命名不标准,用idx_refundTradeNo替换
	tx.Exec("ALTER TABLE ma_order DROP INDEX idx_merchantid_addtime_paymentamount")              // 开发环境的
	tx.Exec("ALTER TABLE ma_order DROP INDEX idx_orderstatus_addtime_paymentamount")             // 开发环境的
	tx.Exec("ALTER TABLE ma_order DROP INDEX idx_orderstatus_merchantid_addtime_discountamount") // 开发环境的
	// 增加索引
	tx.Migrator().CreateIndex(&models.MaOrder{}, "idx_salesID")                    // 售卖ID
	tx.Migrator().CreateIndex(&models.MaOrder{}, "idx_refundTradeNo")              // 退款交易号
	tx.Migrator().CreateIndex(&models.MaOrder{}, "idx_addTime_outTradeNo")         // 查找分组排序
	tx.Migrator().CreateIndex(&models.MaOrder{}, "idx_childOutTradeNo")            // 子订单查询
	tx.Migrator().CreateIndex(&models.MaOrder{}, "idx_outTradeNo_childOutTradeNo") // 唯一性约束，同时满足索引查询
	tx.Migrator().CreateIndex(&models.MaRobotErrorLogPallets{}, "idx_outTradeNo")  // 交易号
	// 商品背景图。增加merchantID，更新image字段类型为varchar
	tx.Migrator().AutoMigrate(&models.MaGoodsBackground{})
	return nil
}

// go run main.go fixdb -t robot_daily_report_task 2024-01-01 2024-03-31
func (MigrateFunc) Script202407() error {
	// 因为跳过了3.12，所以6月份数据迁移要重复执行一次
	// MigrateFunc{}.Script202406()
	tx := mysql.NewDB().Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci").
		Session(&gorm.Session{})
	tx.Migrator().AddColumn(&models.RobotDailyReport{}, "total_to_task_duration")
	tx.Migrator().AddColumn(&models.RobotDailyReport{}, "total_to_charging_duration")
	tx.Migrator().AddColumn(&models.RobotDailyReport{}, "district_id")
	tx.Migrator().AddColumn(&models.MaRobotConfig{}, "robot_select_type")
	tx.Migrator().AddColumn(&models.MaRobotConfig{}, "merchant_select")
	tx.Migrator().AddColumn(&models.RobotDailyReport{}, "total_fault_duration")
	tx.Migrator().AlterColumn(&models.MaRobotReportLog{}, "robot_name")
	tx.Migrator().AlterColumn(&models.MaRobotReportLog{}, "merchant_id")
	tx.Migrator().CreateIndex(&models.MaRobotEmptyStock{}, "idx_date_robotName")
	tx.Migrator().CreateIndex(&models.MaRobotEmptyStock{}, "idx_date_merchantID")
	tx.Migrator().AddColumn(&models.MaRobotSalesInfo{}, "goods_reserve_inventory")
	tx.Migrator().AddColumn(&models.StareCount{}, "stare_count3")
	tx.Migrator().AddColumn(&models.RobotDailyReport{}, "facecount_back")
	tx.Migrator().AddColumn(&models.RobotDailyReport{}, "starecount_back")
	tx.Migrator().AddColumn(&models.MaRobotReport{}, "facecount3")
	tx.Migrator().AddColumn(&models.MaAIServiceFaceCount{}, "face_count3")
	tx.Migrator().RenameColumn(&models.MaRobotReportLog{}, "web_hook_url", "web_hook_address")
	tx.Migrator().AddColumn(&models.MaGoodsInfo{}, "tag_code")
	// 优化设备库存表索引
	tx.Exec("ALTER TABLE ma_robot_inventory DROP INDEX Date_RobotName")
	tx.Migrator().CreateIndex(&models.MaRobotInventory{}, "idx_robotName")
	tx.Migrator().CreateIndex(&models.MaRobotInventory{}, "idx_date_robotName_goodsID")
	return nil
}

func (MigrateFunc) Script202408() error {
	tx := mysql.NewDB().Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci").
		Session(&gorm.Session{})
	tx.Migrator().AddColumn(&models.MaOrder{}, "order_source")
	tx.Migrator().AddColumn(&models.MaOrder{}, "expired_at")
	tx.Migrator().AutoMigrate(&models.StareAgeGender{})
	tx.Migrator().AutoMigrate(&models.StareCount{})
	// 优化设备库存表索引
	tx.Exec("ALTER TABLE ma_robot_inventory DROP INDEX Date_RobotName")
	tx.Migrator().DropIndex(&models.MaRobotInventory{}, "idx_robotName")
	tx.Migrator().CreateIndex(&models.MaRobotInventory{}, "idx_date_robotName_goodsID")
	// 补货记录增加操作人
	tx.Migrator().AutoMigrate(&models.MaSaleInfoLog{})
	tx.Migrator().AddColumn(&models.MaOrder{}, "inventory_unfreeze_at")
	return nil
}

// 1.支付方式合并
// go run main.go fixdb -t payment_merge
func (MigrateFunc) Script202409() error {
	tx := mysql.NewDB().Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci").
		Session(&gorm.Session{})
	// payment表字段调整
	tx.Migrator().DropColumn(&models.MaPayment{}, "pay_name")
	tx.Migrator().DropColumn(&models.MaPayment{}, "add_time")
	tx.Migrator().DropColumn(&models.MaPayment{}, "use_status")
	tx.Migrator().DropColumn(&models.MaPayment{}, "used_count")
	tx.Migrator().DropColumn(&models.MaPayment{}, "status")
	tx.Migrator().AutoMigrate(&models.MaPayment{})
	tx.Migrator().AddColumn(&models.MaGoodsInfo{}, "purchase_type")
	// 优化对象关联表的索引
	tx.Migrator().DropIndex(&models.MaObjAssociation{}, "idx_association")
	tx.Migrator().AutoMigrate(&models.MaObjAssociation{})
	return nil
}

// robot加字段
func (MigrateFunc) Script202504() error {
	tx := mysql.NewDB().Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci").
		Session(&gorm.Session{})
	tx.Migrator().AutoMigrate(&models.MaRobot{})
	return nil
}

// robot加字段
func (MigrateFunc) Script202505() error {
	tx := mysql.NewDB().Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci").
		Session(&gorm.Session{})
	tx.Migrator().AutoMigrate(
		&models.MaRobot{},
		&models.MaGoodsInfo{},
		&models.ExpressFeeSetting{},
		&models.OrderShipmentInfo{},
		&models.OrderShippingTracking{},
	)
	return nil
}

func (MigrateFunc) Script202508() error {
	tx := mysql.NewDB().Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci").
		Session(&gorm.Session{})

	err := tx.Migrator().AutoMigrate(
		&models.MaGoodsInfoLog{},
		&models.MaGoodsInfo{},
		&models.MaActivity{},
	)
	
	helper.Must(err)

	return nil
}
